#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

int main()
{
  //重定向：由于系统底层实现了文件管理和进程管理相互分离，所以系统并不会直到对应的文件描述符指向什么具体的文件
  //利用dup函数可以实现重定向(用oldfd内的内容覆盖newfd内的内容)
  //重定向方法一：不推荐
  //close(1);
  //int fd = open("log.txt", O_WRONLY|O_CREAT|O_APPEND, 0666);
  //if(fd < 0) perror("open fail!");
  //const char* mesg = "hello linux file dup\n";
  //write(1, mesg, strlen(mesg));
  //close(fd);
  /////////////////////////////////
  //重定向方法二:调用dup2函数
  int fd = open("log.txt", O_WRONLY|O_CREAT|O_APPEND, 0666);
  const char* mesg = "hello unistd dup2\n";
  dup2(fd, 1);
  write(1, mesg, strlen(mesg));
  close(fd);
  return 0;
}
//int main()
//{
//  //fd:file descriptor
//  //进程打开时，会有一个struct file_structs*的指针，其将指向一个存放struct file*的地址的数组，fd(文件描述符)就是对应数组的下标
//  //如果当前在创建新文件，对于系统调用接口来说就需要告诉他初始权限
//  //O_TRUNC:清空当前文件, O_APPEND:追加当前文件
//  //操作系统会默认打开三个流：标准输入，标准输出，标准错误
//  printf("stdin:%d", stdin->_fileno);
//  printf("stdout:%d", stdout->_fileno);
//  printf("stderr:%d", stderr->_fileno);
//
//  int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//  printf("fd:%d\n", fd);
//  const char* message = "aaa";
//  write(fd, message, strlen(message));
//  return 0;
//}
